package com.hilin.hilinim.netty.ws;

import com.hilin.entity.po.AccountInfoPo;
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.handler.codec.http.FullHttpRequest;

/**
 * websocket回调
 * 触发顺序 initBefore->initAfter->handshake->afterHandshake->[onMsg]->close
 *
 * @author qhl
 */
public interface IWsHandler {

    /**
     * 握手是否成功
     *
     * @param request 用户连接信息
     * @return 握手成功，则返回用的在业务层用户信息，返回null则表示认证失败，系统会断开当前websocket连接
     */
    AccountInfoPo handshake(FullHttpRequest request, Channel channel);

    /**
     * 握手成功之后的回调
     *
     * @param user 用户信息
     */
    void afterHandshake(AccountInfoPo user, Channel channel);

    /**
     * 收到文本消息
     *
     * @param user 用户信息
     * @param msg  消息内容
     * @return 需要发送给当前用户的消息体，为空（null）则不返回
     */
    String onMsg(AccountInfoPo user, String msg, Channel channel);

    /**
     * 收到二进制消息
     *
     * @param user 用户信息
     * @param msg  消息内容
     * @return 需要发送给当前用户的消息体，为空（null）则不返回
     */
    ByteBuf onMsg(AccountInfoPo user, ByteBuf msg, Channel channel);

    /**
     * 收到用户消息的回调，无论什么消息都会回调
     *
     * @param user
     */
    void onMsg(AccountInfoPo user, Channel channel);

    /**
     * 用户退出
     *
     * @param user 用户信息
     */
    void close(AccountInfoPo user, String reason, Channel channel);
}